/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.skycode.segu.manager;

import com.skycode.cnx.Conexion;
import com.skycode.segu.dto.UsuarioDto;
import java.io.Serializable;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

/**
 * @author SkyCode (skycode@gmail.com)
 * @since 13/01/2014
 * @version 1.0
 */
public class UsuarioManager implements Serializable{

    /**
     * url: variable que almacena la dirección de la vista usuario.xhtml
     *
     * @since 13/01/2014
     */
    private final String url = "/pages/segu/usuario/usuario.xhtml";
    /**
     * urlLista: variable que almacena la dirección de la vista
     * listaUsuario.xhtml;
     *
     * @since 13/01/2014
     */
    private final String urlLista = "/pages/segu/usuario/listaUsuario.xhtml";

    /**
     * inicializar(): inicializa la entidad UsuarioDto
     *
     * @since 13/01/2014
     * @return UsuarioDto
     */
    public UsuarioDto inicializar() {
        UsuarioDto dto = new UsuarioDto();
        dto.setDescripcion("");
        dto.setDescripcionCorta("");
        dto.setUsername("");
        dto.setPassword("");
        dto.setEmail("");
        dto.setEstado(Boolean.TRUE);
        dto.setUrl("");
        dto.setUrlImagen("");

        return dto;
    }

    /**
     * listarTodos(): se encarga de listar todas las entidades UsuarioDto
     *
     * @since 13/01/2014
     * @return List<UsuarioDto>
     */
    public List<UsuarioDto> listarTodos() {
        List<UsuarioDto> lista = new ArrayList<UsuarioDto>();
        try {
            Connection cnx = Conexion.getConexionOracle();
            String query = "select * from JSEGU_USUARIO";
            PreparedStatement ps = cnx.prepareStatement(query);
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                UsuarioDto usuarioDto = new UsuarioDto();
                usuarioDto.setId(rs.getLong(1));
                usuarioDto.setDescripcion(rs.getString(2));
                usuarioDto.setDescripcionCorta(rs.getString(3));
                usuarioDto.setUsername(rs.getString(4));
                usuarioDto.setPassword(rs.getString(5));
                usuarioDto.setEmail(rs.getString(6));
                usuarioDto.setEstado(rs.getBoolean(7));
                usuarioDto.setUrl(rs.getString(8));
                usuarioDto.setUrlImagen(rs.getString(9));
                lista.add(usuarioDto);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return lista;
    }

    /**
     * obtenerPorId(): obtiene la entidad UsuarioDto basándose en un id pasado
     * como parámetro
     *
     * @since 13/01/2014
     * @param id
     * @return UsuarioDto
     */
    public UsuarioDto obtenerPorId(Long id) {
        UsuarioDto usuarioDto = new UsuarioDto();
        try {
            Connection cnx = Conexion.getConexionOracle();
            String query = "select * from JSEGU_USUARIO where ID = " + id;
            PreparedStatement ps = cnx.prepareStatement(query);
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                usuarioDto.setId(rs.getLong(1));
                usuarioDto.setDescripcion(rs.getString(2));
                usuarioDto.setDescripcionCorta(rs.getString(3));
                usuarioDto.setUsername(rs.getString(4));
                usuarioDto.setPassword(rs.getString(5));
                usuarioDto.setEmail(rs.getString(6));
                usuarioDto.setEstado(rs.getBoolean(7));
                usuarioDto.setUrl(rs.getString(8));
                usuarioDto.setUrlImagen(rs.getString(9));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return usuarioDto;
    }

    /**
     * obtenerUsuario(): obtiene una entidad UsuarioDto tomando un filtro
     *
     * @param dto
     * @return UsuarioDto
     */
    public UsuarioDto obtenerUsuario(UsuarioDto dto) {
        UsuarioDto usuarioDto = new UsuarioDto();
        try {
            Connection cnx = Conexion.getConexionOracle();
            String query = "select * from JSEGU_USUARIO where ID = ID";
            if (dto.getId() != null) {
                query += " and ID = " + dto.getId();
            } else {
                if (dto.getDescripcion() != null && dto.getDescripcion().length() > 0) {
                    query += " and DESCRIPCION like '" + dto.getDescripcion() + "'";
                }
                if (dto.getDescripcionCorta() != null && dto.getDescripcionCorta().length() > 0) {
                    query += " and DESCRIPCION_CORTA like '" + dto.getDescripcionCorta() + "'";
                }
                if (dto.getUsername() != null && dto.getUsername().length() > 0) {
                    query += " and USERNAME like '" + dto.getUsername() + "'";
                }
                if (dto.getPassword() != null && dto.getPassword().length() > 0) {
                    query += " and PASSWORD like '" + dto.getPassword() + "'";
                }
                if (dto.getEmail() != null && dto.getEmail().length() > 0) {
                    query += " and EMAIL like '" + dto.getEmail() + "'";
                }
//                if (dto.getEstado() != null) {
//                    query += " and ESTADO = " + dto.getEstado();
//                }
                PreparedStatement ps = cnx.prepareStatement(query);
                ResultSet rs = ps.executeQuery(query);
                rs.next();
                usuarioDto.setId(rs.getLong(1));
                usuarioDto.setDescripcion(rs.getString(2));
                usuarioDto.setDescripcionCorta(rs.getString(3));
                usuarioDto.setUsername(rs.getString(4));
                usuarioDto.setPassword(rs.getString(5));
                usuarioDto.setEmail(rs.getString(6));
                usuarioDto.setEstado(rs.getBoolean(7));
                usuarioDto.setUrl(rs.getString(8));
                usuarioDto.setUrlImagen(rs.getString(9));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("ANTES DE RETORNAR EL USUARIO");
        System.out.println("USUARIO: " + usuarioDto);
        return usuarioDto;
    }
    
    public UsuarioDto obtenerUsuarioParaLogin(UsuarioDto dto) {
        UsuarioDto usuarioDto = new UsuarioDto();
        try {
            Connection cnx = Conexion.getConexionOracle();
            String query = "SELECT * FROM JSEGU_USUARIO WHERE USERNAME = '" + dto.getUsername()
                    + "' AND PASSWORD = '" + dto.getPassword() + "'";
            PreparedStatement ps = cnx.prepareStatement(query);
                ResultSet rs = ps.executeQuery(query);
                rs.next();
                usuarioDto.setId(rs.getLong(1));
                usuarioDto.setDescripcion(rs.getString(2));
                usuarioDto.setDescripcionCorta(rs.getString(3));
                usuarioDto.setUsername(rs.getString(4));
                usuarioDto.setPassword(rs.getString(5));
                usuarioDto.setEmail(rs.getString(6));
                usuarioDto.setEstado(rs.getBoolean(7));
                usuarioDto.setUrl(rs.getString(8));
                usuarioDto.setUrlImagen(rs.getString(9));
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        return usuarioDto;
    }

    public List<UsuarioDto> obtenerUsuarios(UsuarioDto dto) {
        List<UsuarioDto> lista = new ArrayList<UsuarioDto>();
        try {
            Connection cnx = Conexion.getConexionOracle();
            String query = "select * from JSEGU_USUARIO where ID = ID";
            if (dto.getId() != null) {
                query += " and ID = " + dto.getId();
            } else {
                if (dto.getDescripcion() != null && dto.getDescripcion().length() > 0) {
                    query += " and DESCRIPCION like '" + dto.getDescripcion() + "'";
                }
                if (dto.getDescripcionCorta() != null && dto.getDescripcionCorta().length() > 0) {
                    query += " and DESCRIPCION_CORTA like '" + dto.getDescripcionCorta() + "'";
                }
                if (dto.getUsername() != null && dto.getUsername().length() > 0) {
                    query += " and USERNAME like '" + dto.getUsername() + "'";
                }
                if (dto.getPassword() != null && dto.getPassword().length() > 0) {
                    query += " and PASSWORD like '" + dto.getPassword() + "'";
                }
                if (dto.getEmail() != null && dto.getEmail().length() > 0) {
                    query += " and EMAIL like '" + dto.getEmail() + "'";
                }
//                if (dto.getEstado() != null) {
//                    query += " and ESTADO = " + dto.getEstado();
//                }

            }
            PreparedStatement ps = cnx.prepareStatement(query);
            ResultSet rs = ps.executeQuery(query);
            while (rs.next()) {
                UsuarioDto usuarioDto = new UsuarioDto();
                usuarioDto.setId(rs.getLong(1));
                usuarioDto.setDescripcion(rs.getString(2));
                usuarioDto.setDescripcionCorta(rs.getString(3));
                usuarioDto.setUsername(rs.getString(4));
                usuarioDto.setPassword(rs.getString(5));
                usuarioDto.setEmail(rs.getString(6));
                usuarioDto.setEstado(rs.getBoolean(7));
                usuarioDto.setUrl(rs.getString(8));
                usuarioDto.setUrlImagen(rs.getString(9));
                lista.add(usuarioDto);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return lista;
    }

    public UsuarioDto existeUsuario(UsuarioDto dto) {
        UsuarioDto usuarioDto = this.obtenerUsuarioParaLogin(dto);
        System.out.println(usuarioDto != null);
        return usuarioDto;
    }

    public void guardar(UsuarioDto dto) {
        try {
            Connection cnx = Conexion.getConexionOracle();
            String query = "INSERT INTO JSEGU_USUARIO VALUES (?,?,?,?,?,?,?,?,?)";
            PreparedStatement ps = cnx.prepareStatement(query);
            ps.setLong(1, generarId(dto));
            ps.setString(2, dto.getDescripcion());
            ps.setString(3, dto.getDescripcionCorta());
            ps.setString(4, dto.getUsername());
            ps.setString(5, dto.getPassword());
            ps.setString(6, dto.getEmail());
            ps.setBoolean(7, Boolean.TRUE);
            ps.setString(8, dto.getUrl());
            ps.setString(9, dto.getUrlImagen());
            ps.executeQuery();
            System.out.println("DESPUES DE EJECUTAR QUERY");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public Long generarId(UsuarioDto dto) {
        Long maxId = 0L;
        List<UsuarioDto> lista = listarTodos();
        if (lista != null && lista.size() > 0) {
            for (UsuarioDto x : lista) {
                if (x.getId().compareTo(maxId) > 0) {
                    maxId = x.getId();
                }
            }
            maxId = maxId + 1;
        } else {
            maxId = 100L;
        }
        return maxId;
    }

    public String getUrl() {
        return url;
    }

    public String getUrlLista() {
        return urlLista;
    }
}
